home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / game / shoot / ADescentSrc.lha / descent / main / config.c < prev    next >
C/C++ Source or Header  |  1998-08-08  |  14KB  |  442 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /*
  14.  * $Source: /usr/CVS/descent/main/config.c,v $
  15.  * $Revision: 1.8 $
  16.  * $Author: nobody $
  17.  * $Date: 1998/08/08 15:42:54 $
  18.  * 
  19.  * contains routine(s) to read in the configuration file which contains
  20.  * game configuration stuff like detail level, sound card, etc
  21.  *
  22.  * $Log: config.c,v $
  23.  * Revision 1.8  1998/08/08 15:42:54  nobody
  24.  * Activated the Editior
  25.  *
  26.  * Revision 1.7  1998/04/13 17:50:53  tfrieden
  27.  * Kali stuff added
  28.  *
  29.  * Revision 1.6  1998/04/05 01:55:53  tfrieden
  30.  * Added warnigns for invalid values
  31.  *
  32.  * Revision 1.5  1998/04/03 13:59:58  tfrieden
  33.  * Added safety check for AHI stuff
  34.  *
  35.  * Revision 1.4  1998/03/22 16:02:04  hfrieden
  36.  * Added config item VirgeNumTextures
  37.  *
  38.  * Revision 1.3  1998/03/13 23:46:02  tfrieden
  39.  * Fixed bug with volume settings
  40.  *
  41.  * Revision 1.2  1998/03/12 22:12:10  hfrieden
  42.  * Empty Log Message
  43.  *
  44.  * Revision 1.1.1.1  1998/03/03 15:12:13  nobody
  45.  * reimport after crash from backup
  46.  *
  47.  * Revision 1.4  1998/02/28 00:37:46  tfrieden
  48.  * aga support
  49.  *
  50.  * Revision 1.3  1998/02/21 23:16:16  hfrieden
  51.  * *** empty log message ***
  52.  *
  53.  * Revision 1.2  1998/02/14 10:08:11  hfrieden
  54.  * New configuration options for AHI added
  55.  *
  56.  */
  57.  
  58. #include <stdio.h>
  59. #include <stdlib.h>
  60. #include <string.h>
  61. #include <ctype.h>
  62.  
  63. #include "types.h"
  64. #include "game.h"
  65. #include "digi.h"
  66. #include "kconfig.h"
  67. #include "palette.h"
  68. #include "joy.h"
  69. #include "args.h"
  70. #include "player.h"
  71. #include "mission.h"
  72.  
  73. #define SERVER_NAME_LEN 64
  74.  
  75. // #pragma pack (4);                        // Use 32-bit packing!
  76. #pragma off (check_stack);          // No stack checking!
  77. //#include "sos.h"//These sos headers are part of a commercial library, and aren't included-KRB
  78. //#include "sosm.h"
  79.  
  80. #pragma off (unreferenced)
  81. static char rcsid[] = "$Id: config.c,v 1.8 1998/08/08 15:42:54 nobody Exp $";
  82. #pragma on (unreferenced)
  83.  
  84. static char *digi_dev_str = "DigiDeviceID";
  85. static char *digi_port_str = "DigiPort";
  86. static char *digi_irq_str = "DigiIrq";
  87. static char *digi_dma_str = "DigiDma";
  88. static char *digi_volume_str = "DigiVolume";
  89. static char *midi_volume_str = "MidiVolume";
  90. static char *midi_dev_str = "MidiDeviceID";
  91. static char *midi_port_str = "MidiPort";
  92. static char *detail_level_str = "DetailLevel";
  93. static char *gamma_level_str = "GammaLevel";
  94. static char *stereo_rev_str = "StereoReverse";
  95. static char *joystick_min_str = "JoystickMin";
  96. static char *joystick_max_str = "JoystickMax";
  97. static char *joystick_cen_str = "JoystickCen";
  98. static char *last_player_str = "LastPlayer";
  99. static char *last_mission_str = "LastMission";
  100. static char *config_vr_type_str = "VR_type";
  101. static char *config_vr_tracking_str = "VR_tracking";
  102. static char *ahi_audio_mode_str = "AHIAudioMode";
  103. static char *ahi_mix_freq_str = "AHIMixFreq";
  104. static char *ahi_max_channels_str = "AHIMaxChannels";
  105. static char *ahi_vol_boost_str = "AHIVolumeBoost";
  106. static char *mode_320x200_str = "Mode320x200";
  107. static char *mode_320x400_str = "Mode320x400";
  108. static char *mode_640x480_str = "Mode640x480";
  109. static char *mode_800x600_str = "Mode800x600";
  110. static char *config_kali_server_str = "KaliServer";
  111. static char *virge_numtext_str = "VirgeNumTextures";
  112.  
  113. char config_last_player[CALLSIGN_LEN+1] = "";
  114. char config_last_mission[MISSION_NAME_LEN+1] = "";
  115. char config_kali_server[SERVER_NAME_LEN+1] = "";
  116.  
  117. int Config_digi_type = 0;
  118. int Config_midi_type = 0;
  119.  
  120. int Config_vr_type = 0;
  121. int Config_vr_tracking = 0;
  122.  
  123. extern byte Object_complexity, Object_detail, Wall_detail, Wall_render_depth, Debris_amount, SoundChannels;
  124.  
  125. extern int ahidigi_audio_mode, ahidigi_audio_freq, ahidigi_max_channels,
  126.            ahidigi_volume_boost;
  127. extern unsigned long Mode320x200, Mode320x400, Mode640x480, Mode800x600;
  128.  
  129. #ifdef VIRGIN
  130. extern int Max_textures;
  131. #else
  132. int Max_textures;
  133. #endif
  134.  
  135. void set_custom_detail_vars(void);
  136.  
  137.  
  138. #define CL_MC0 0xF8F
  139. #define CL_MC1 0xF8D
  140.  
  141. void CrystalLakeWriteMCP( ushort mc_addr, ubyte mc_data )
  142. {
  143. }
  144.  
  145. ubyte CrystalLakeReadMCP( ushort mc_addr )
  146. {
  147.     return 0;
  148. }
  149.  
  150. void CrystalLakeSetSB()
  151. {
  152.     ubyte tmp;
  153.     tmp = CrystalLakeReadMCP( CL_MC1 );
  154.     tmp &= 0x7F;
  155.     CrystalLakeWriteMCP( CL_MC1, tmp );
  156. }
  157.  
  158. void CrystalLakeSetWSS()
  159. {
  160.     ubyte tmp;
  161.     tmp = CrystalLakeReadMCP( CL_MC1 );
  162.     tmp |= 0x80;
  163.     CrystalLakeWriteMCP( CL_MC1, tmp );
  164. }
  165.  
  166. int ReadConfigFile()
  167. {
  168.     FILE *infile;
  169.     char line[80], *token, *value, *ptr;
  170.     ubyte gamma;
  171.     int joy_axis_min[4];
  172.     int joy_axis_center[4];
  173.     int joy_axis_max[4];
  174.     int i;
  175.  
  176.     strcpy( config_last_player, "" );
  177.  
  178.     joy_axis_min[0] = joy_axis_min[1] = joy_axis_min[2] = joy_axis_min[3] = 0;
  179.     joy_axis_max[0] = joy_axis_max[1] = joy_axis_max[2] = joy_axis_max[3] = 0;
  180.     joy_axis_center[0] = joy_axis_center[1] = joy_axis_center[2] = joy_axis_center[3] = 0;
  181.     joy_set_cal_vals(joy_axis_min, joy_axis_center, joy_axis_max);
  182.  
  183.     digi_driver_board = 100;
  184.     digi_driver_port = 100;
  185.     digi_driver_irq = 100;
  186.     digi_driver_dma = 100;
  187.  
  188.     digi_midi_type = 100;
  189.     digi_midi_port = 100;
  190.  
  191.     Config_digi_volume = 4;
  192.     Config_midi_volume = 4;
  193.     Config_control_type = 0;
  194.     Config_channels_reversed = 0;
  195.  
  196.     infile = fopen("descent.cfg", "rt");
  197.     if (infile == NULL) {
  198.         return 1;
  199.     }
  200.     while (!feof(infile)) {
  201.         memset(line, 0, 80);
  202.         fgets(line, 80, infile);
  203.         ptr = &(line[0]);
  204.         while (isspace(*ptr))
  205.             ptr++;
  206.         if (*ptr != '\0') {
  207.             token = strtok(ptr, "=");
  208.             value = strtok(NULL, "=");
  209.             if (!strcmp(token, digi_dev_str))
  210.                 digi_driver_board = strtol(value, NULL, 16);
  211.             else if (!strcmp(token, digi_port_str))
  212.                 digi_driver_port = strtol(value, NULL, 16);
  213.             else if (!strcmp(token, virge_numtext_str))
  214.                 Max_textures = strtol(value, NULL, 10);
  215.             else if (!strcmp(token, digi_irq_str))
  216.                 digi_driver_irq = strtol(value, NULL, 10);
  217.             else if (!strcmp(token, digi_dma_str))
  218.                 digi_driver_dma = strtol(value, NULL, 10);
  219.             else if (!strcmp(token, digi_volume_str))
  220.                 Config_digi_volume = strtol(value, NULL, 10);
  221.             else if (!strcmp(token, midi_dev_str))
  222.                 digi_midi_type = strtol(value, NULL, 16);
  223.             else if (!strcmp(token, midi_port_str))
  224.                 digi_midi_port = strtol(value, NULL, 16);
  225.             else if (!strcmp(token, midi_volume_str))
  226.                 Config_midi_volume = strtol(value, NULL, 10);
  227.             else if (!strcmp(token, ahi_vol_boost_str))
  228.                 ahidigi_volume_boost = strtol(value, NULL, 16);
  229.             else if (!strcmp(token, ahi_audio_mode_str))
  230.                 ahidigi_audio_mode = strtol(value, NULL, 16);
  231.             else if (!strcmp(token, ahi_mix_freq_str))
  232.                 ahidigi_audio_freq   = strtol(value, NULL, 10);
  233.             else if (!strcmp(token, ahi_max_channels_str))
  234.                 ahidigi_max_channels = strtol(value, NULL, 10);
  235.             else if (!strcmp(token, mode_320x200_str))
  236.                 Mode320x200 = strtol(value, NULL, 10);
  237.             else if (!strcmp(token, mode_320x400_str))
  238.                 Mode320x400 = strtol(value, NULL, 10);
  239.             else if (!strcmp(token, mode_640x480_str))
  240.                 Mode640x480 = strtol(value, NULL, 10);
  241.             else if (!strcmp(token, mode_800x600_str))
  242.                 Mode800x600 = strtol(value, NULL, 10);
  243.             else if (!strcmp(token, stereo_rev_str))
  244.                 Config_channels_reversed = strtol(value, NULL, 10);
  245.             else if (!strcmp(token, gamma_level_str)) {
  246.                 gamma = strtol(value, NULL, 10);
  247.                 gr_palette_set_gamma( gamma );
  248.             }
  249.             else if (!strcmp(token, detail_level_str)) {
  250.                 Detail_level = strtol(value, NULL, 10);
  251.                 if (Detail_level == NUM_DETAIL_LEVELS-1) {
  252.                     int count,dummy,oc,od,wd,wrd,da,sc;
  253.  
  254.                     count = sscanf (value, "%d,%d,%d,%d,%d,%d,%d\n",&dummy,&oc,&od,&wd,&wrd,&da,&sc);
  255.  
  256.                     if (count == 7) {
  257.                         Object_complexity = oc;
  258.                         Object_detail = od;
  259.                         Wall_detail = wd;
  260.                         Wall_render_depth = wrd;
  261.                         Debris_amount = da;
  262.                         SoundChannels = sc;
  263.                         set_custom_detail_vars();
  264.                     }
  265.                 }
  266.             }
  267.             else if (!strcmp(token, joystick_min_str))  {
  268.                 sscanf( value, "%d,%d,%d,%d", &joy_axis_min[0], &joy_axis_min[1], &joy_axis_min[2], &joy_axis_min[3] );
  269.             } 
  270.             else if (!strcmp(token, joystick_max_str))  {
  271.                 sscanf( value, "%d,%d,%d,%d", &joy_axis_max[0], &joy_axis_max[1], &joy_axis_max[2], &joy_axis_max[3] );
  272.             }
  273.             else if (!strcmp(token, joystick_cen_str))  {
  274.                 sscanf( value, "%d,%d,%d,%d", &joy_axis_center[0], &joy_axis_center[1], &joy_axis_center[2], &joy_axis_center[3] );
  275.             }
  276.             else if (!strcmp(token, last_player_str))   {
  277.                 char * p;
  278.                 strncpy( config_last_player, value, CALLSIGN_LEN );
  279.                 p = strchr( config_last_player, '\n');
  280.                 if ( p ) *p = 0;
  281.             }
  282.             else if (!strcmp(token, last_mission_str))  {
  283.                 char * p;
  284.                 strncpy( config_last_mission, value, MISSION_NAME_LEN );
  285.                 p = strchr( config_last_mission, '\n');
  286.                 if ( p ) *p = 0;
  287.             } else if (!strcmp(token, config_vr_type_str)) {
  288.                 Config_vr_type = strtol(value, NULL, 10);
  289.             } else if (!strcmp(token, config_vr_tracking_str)) {
  290.                 Config_vr_tracking = strtol(value, NULL, 10);
  291.             } else if (!strcmp(token, config_kali_server_str)) {
  292.                     char * p;
  293.                     strncpy( config_kali_server, value, SERVER_NAME_LEN );
  294.                     p = strchr( config_kali_server, '\n');
  295.                     if ( p ) *p = 0;
  296.             }
  297.         }
  298.     }
  299.  
  300.     if (ahidigi_volume_boost == 0) {
  301.         ahidigi_volume_boost = 1;
  302.         printf("Warning: Set AHIDigiVolumeBoost to 1  (was 0)\n");
  303.     }
  304.     if (ahidigi_audio_freq == 0) {
  305.         ahidigi_audio_freq = 11025;
  306.         printf("Warning: Set AHIDigiAudioFreq to 11025 (was 0)\n");
  307.     }
  308.     if (ahidigi_max_channels == 0) {
  309.         ahidigi_max_channels = 16;
  310.         printf("Warning: Set AHIDigiMaxChannels to 16 (was 0)\n");
  311.     }
  312.  
  313.     fclose(infile);
  314.  
  315.     i = FindArg( "-volume" );
  316.     
  317.     if ( i > 0 )    {
  318.         i = atoi( Args[i+1] );
  319.         if ( i < 0 ) i = 0;
  320.         if ( i > 100 ) i = 100;
  321.         Config_digi_volume = (i*8)/100;
  322.         Config_midi_volume = (i*8)/100;
  323.     }
  324.  
  325.     if ( Config_digi_volume > 8 ) Config_digi_volume = 8;
  326.  
  327.     if ( Config_midi_volume > 8 ) Config_midi_volume = 8;
  328.  
  329.     joy_set_cal_vals(joy_axis_min, joy_axis_center, joy_axis_max);
  330.     digi_set_volume( (Config_digi_volume*32768)/8 * ahidigi_volume_boost,
  331.                 (Config_midi_volume*128)/8 * ahidigi_volume_boost);
  332. /*
  333.     printf( "DigiDeviceID: 0x%x\n", digi_driver_board );
  334.     printf( "DigiPort: 0x%x\n", digi_driver_port        );
  335.     printf( "DigiIrq: 0x%x\n",  digi_driver_irq     );
  336.     printf( "DigiDma: 0x%x\n",  digi_driver_dma );
  337.     printf( "MidiDeviceID: 0x%x\n", digi_midi_type  );
  338.     printf( "MidiPort: 0x%x\n", digi_midi_port      );
  339.     key_getch();
  340. */
  341.  
  342.     Config_midi_type = digi_midi_type;
  343.     Config_digi_type = digi_driver_board;
  344.  
  345.     // HACK!!! 
  346.     //Hack to make the Crytal Lake look like Microsoft Sound System
  347.     if ( digi_driver_board == 0xe200 )  {
  348.         ubyte tmp;
  349.         tmp = CrystalLakeReadMCP( CL_MC1 );
  350.         if ( !(tmp & 0x80) )
  351.             atexit( CrystalLakeSetSB );     // Restore to SB when done.
  352.         CrystalLakeSetWSS();
  353.         digi_driver_board = 0;//_MICROSOFT_8_ST;<was this microsoft thing, but its irrelevant, because we have no sound here yet,being that its also undefined, I set it to 0 -KRB
  354.     }
  355.  
  356.     return 0;
  357. }
  358.  
  359. int WriteConfigFile()
  360. {
  361.     FILE *infile;
  362.     char str[256];
  363.     int joy_axis_min[4];
  364.     int joy_axis_center[4];
  365.     int joy_axis_max[4];
  366.  
  367.     ubyte gamma = gr_palette_get_gamma();
  368.     
  369.     if (FindArg("-noconfig")) return 0;
  370.  
  371.     joy_get_cal_vals(joy_axis_min, joy_axis_center, joy_axis_max);
  372.  
  373.     infile = fopen("descent.cfg", "wt");
  374.     if (infile == NULL) {
  375.         return 1;
  376.     }
  377.  
  378.     sprintf(str, "%s=%d\n", mode_320x200_str, Mode320x200);
  379.     fputs(str, infile);
  380.     sprintf(str, "%s=%d\n", mode_320x400_str, Mode320x400);
  381.     fputs(str, infile);
  382.     sprintf(str, "%s=%d\n", mode_640x480_str, Mode640x480);
  383.     fputs(str, infile);
  384.     sprintf(str, "%s=%d\n", mode_800x600_str, Mode800x600);
  385.     fputs(str, infile);
  386.     sprintf (str, "%s=0x%x\n", ahi_audio_mode_str, ahidigi_audio_mode);
  387.     fputs(str, infile);
  388.     sprintf (str, "%s=%d\n", ahi_mix_freq_str, ahidigi_audio_freq);
  389.     fputs(str, infile);
  390.     sprintf (str, "%s=%d\n", ahi_max_channels_str, ahidigi_max_channels);
  391.     fputs(str, infile);
  392.     sprintf (str, "%s=%d\n", ahi_vol_boost_str, ahidigi_volume_boost);
  393.     fputs(str, infile);
  394.     sprintf (str, "%s=0x%x\n", digi_dev_str, Config_digi_type);
  395.     fputs(str, infile);
  396.     sprintf (str, "%s=0x%x\n", digi_port_str, digi_driver_port);
  397.     fputs(str, infile);
  398.     sprintf (str, "%s=%d\n", digi_irq_str, digi_driver_irq);
  399.     fputs(str, infile);
  400.     sprintf (str, "%s=%d\n", digi_dma_str, digi_driver_dma);
  401.     fputs(str, infile);
  402.     sprintf (str, "%s=%d\n", digi_volume_str, Config_digi_volume);
  403.     fputs(str, infile);
  404.     sprintf (str, "%s=0x%x\n", midi_dev_str, Config_midi_type);
  405.     fputs(str, infile);
  406.     sprintf (str, "%s=0x%x\n", midi_port_str, digi_midi_port);
  407.     fputs(str, infile);
  408.     sprintf (str, "%s=%d\n", midi_volume_str, Config_midi_volume);
  409.     fputs(str, infile);
  410.     sprintf (str, "%s=%d\n", stereo_rev_str, Config_channels_reversed);
  411.     fputs(str, infile);
  412.     sprintf (str, "%s=%d\n", gamma_level_str, gamma);
  413.     fputs(str, infile);
  414.     if (Detail_level == NUM_DETAIL_LEVELS-1)
  415.         sprintf (str, "%s=%d,%d,%d,%d,%d,%d,%d\n", detail_level_str, Detail_level,
  416.                 Object_complexity,Object_detail,Wall_detail,Wall_render_depth,Debris_amount,SoundChannels);
  417.     else
  418.         sprintf (str, "%s=%d\n", detail_level_str, Detail_level);
  419.     fputs(str, infile);
  420.     sprintf (str, "%s=%d,%d,%d,%d\n", joystick_min_str, joy_axis_min[0], joy_axis_min[1], joy_axis_min[2], joy_axis_min[3] );
  421.     fputs(str, infile);
  422.     sprintf (str, "%s=%d,%d,%d,%d\n", joystick_cen_str, joy_axis_center[0], joy_axis_center[1], joy_axis_center[2], joy_axis_center[3] );
  423.     fputs(str, infile);
  424.     sprintf (str, "%s=%d,%d,%d,%d\n", joystick_max_str, joy_axis_max[0], joy_axis_max[1], joy_axis_max[2], joy_axis_max[3] );
  425.     fputs(str, infile);
  426.     sprintf (str, "%s=%s\n", last_player_str, Players[Player_num].callsign );
  427.     fputs(str, infile);
  428.     sprintf (str, "%s=%s\n", last_mission_str, config_last_mission );
  429.     fputs(str, infile);
  430.     sprintf (str, "%s=%d\n", config_vr_type_str, Config_vr_type );
  431.     fputs(str, infile);
  432.     sprintf (str, "%s=%d\n", config_vr_tracking_str, Config_vr_tracking );
  433.     fputs(str, infile);
  434.     sprintf (str, "%s=%d\n", virge_numtext_str, Max_textures);
  435.     fputs(str, infile);
  436.     sprintf (str, "%s=%s\n", config_kali_server_str, config_kali_server );
  437.     fputs(str, infile);
  438.     fclose(infile);
  439.     return 0;
  440. }       
  441.  
  442.